<?php

require_once ROOT . 'server/classes/arquitetura/service/AbstractService.class.php';

/**
 * Esta classe executa as chamadas DAO.
 * @author Tiago <tiago.professor@gmail.com>
 */
class CategoriaServiceDao extends AbstractService {

    /**
     * Executa as chamadas de insert ou update no banco de dados.
     * @author Tiago <tiago.professor@gmail.com>
     */
    public function executarSalvar() {
        //Preparando objetos
        $entity = $this->getModel()->getCategoria();
        $registroJaExiste = Util::isNotEmpty($entity->getId());
        $dao = new CategoriaDao($entity);
        
        $sqlToExec = 'call sCategoriaSalvar(\'' . $entity->getNome() . '\')';
    }
    
    /**
     * Executa as chamadas de insert ou update no banco de dados.
     * @author Tiago <tiago.professor@gmail.com>
     */
    public function OLD_executarSalvar() {
        //Preparando objetos
        $entity = $this->getModel()->getCategoria();
        $registroJaExiste = Util::isNotEmpty($entity->getId());
        $dao = new CategoriaDao($entity);

        $sqlToExec = '';
        if($registroJaExiste) {
            $categoriaDB = null;
            //Select para recuperar a última data de update
            $sqlToExec = $dao->getFindSQL('id = ' . $entity->getId());
            $sqlResult = $this->conn->executeQuery($sqlToExec);
            while($row = $this->conn->fetchAssoc($sqlResult)) {
                $categoriaDB = CategoriaHelper::getObjFromDB($row);
            }
            if($entity->getUpdateDate() == $categoriaDB->getUpdateDate()) {
                $sqlToExec = $dao->getUpdateSQL();
            } else {
                if($this->log->isInfoEnabled()) {
                    $this->log->logInfo('Data de última atualização diferente.');
                    $this->log->logInfo('Data do model: ' . $entity->getUpdateDate());
                    $this->log->logInfo('Data do banco: ' . $categoriaDB->getUpdateDate());
                }
                $this->getModel()->setResult(ResultFactory::newResultFalhaOcorreuAtualizacao());
                return;
            }
        } else {
            $sqlToExec = $dao->getInsertSQL();
        }
        //Executando o comando para alteração na base.
        $sqlResult = $this->conn->executeUpdate($sqlToExec);

        if ($sqlResult == self::ONE_ROW) {
            if (!($registroJaExiste)) {
                $entity->setId($this->conn->getAutoId());
            }
            $sqlToExec = $dao->getFindSQL('id = ' . $entity->getId());
            //Leitura do registro adicionado.
            $sqlResult = $this->conn->executeQuery($sqlToExec);
            while($row = $this->conn->fetchAssoc($sqlResult)) {
                $entity->setUpdateDate($row['update_date']);
            }
            $jsonResult = CategoriaHelper::getJsonFromEntity($entity);
            $this->getModel()->setResult(
                    ResultFactory::newResultSingleSucesso($jsonResult));
        } else {
            //Erro, desfazendo a transação
            $this->conn->rollback();
            $this->getModel()->setResult(ResultFactory::newResultFalha('Erro', 'Erro inserindo/atualizando categoria.'));
        }
    }

    /**
     * Executa a chamada para persistir o novo registro no banco de dados.
     * @author Tiago <tiago.professor@gmail.com>
     */
    public function executarSalvarComo() {
        //Preparando objetos
        $entity = $this->getModel()->getCategoria();
        $dao = new CategoriaDao($entity);

        $sqlToExec = $dao->getInsertSQL();

        //Executando o comando para alteração na base.
        $sqlResult = $this->conn->executeUpdate($sqlToExec);

        if ($sqlResult == self::ONE_ROW) {
            $entity->setId($this->conn->getAutoId());
            $sqlToExec = $dao->getFindSQL('id = ' . $entity->getId());
            //Leitura do registro adicionado.
            $sqlResult = $this->conn->executeQuery($sqlToExec);
            while($row = $this->conn->fetchAssoc($sqlResult)) {
                $entity->setUpdateDate($row['update_date']);
            }
            $jsonResult = CategoriaHelper::getJsonFromEntity($entity);
            $this->getModel()->setResult(
                    ResultFactory::newResultSingleSucesso($jsonResult));
        } else {
            //Erro, desfazendo a transação
            $this->conn->rollback();
            $this->getModel()->setResult(ResultFactory::newResultFalha('Erro', 'Erro inserindo/atualizando categoria.'));
        }
    }

    /**
     * Instrução SQL para ser executada.
     * @author Tiago <tiago.professor@gmail.com>
     * @return string
     */
    public function getSqlConsulta() {
        $dao = new CategoriaDao($this->getModel()->getCategoria());
        return $dao->getByEntityFindNoNullSQL();
    }

    /**
     * Executa a chamada para excluir o registro do banco de dados.
     * @author Tiago <tiago.professor@gmail.com>
     */
    public function executarExcluir() {
        //Preparando objetos
        $entity = $this->getModel()->getCategoria();
        if(Util::isNotEmpty($entity->getId())) {
            $dao = new CategoriaDao($entity);

            $sqlToExec = $dao->getDeleteSQL();

            //Executando o comando para alteração na base.
            $sqlResult = $this->conn->executeUpdate($sqlToExec);

            if ($sqlResult != self::ONE_ROW) {
                //Erro, desfazendo a transação
                $this->conn->rollback();
                $this->getModel()->setResult(ResultFactory::newResultFalha('Erro', 'Erro excluindo categoria.'));
            }
        } else {
            $this->getModel()->setResult(ResultFactory::newResultFalha('Erro', 'Erro excluindo categoria.'));
        }
    }

    public function executarPesquisa() {
        //Preparando objetos
        $entity = $this->getModel()->getCategoria();
        $dao = new CategoriaDao($entity);
        
        $where  = '';
        if(Util::isNotEmpty($this->getModel()->getCategoria()->getNome())) {
            $nome = $this->getModel()->getCategoria()->getNome();
            $where .= ' upper(nome) like \'%' . strtoupper($nome) . '%\'';
        }
        
        //Executando comando para recuperar o total de linhas.
        $numRows = 0;
        $sqlToExec = $dao->getNumLinhasSQLPesquisa($where);
        $sqlResult = $this->conn->executeQuery($sqlToExec);
        while($row = $this->conn->fetchAssoc($sqlResult)) {
            $numRows = $row['num_rows'];
        }

        //Pesquisando.
        $sqlToExec = $dao->getSQLPesquisa(
                $this->getModel()->getStart(),
                $this->getModel()->getLimit(),
                $where);
        $sqlResult = $this->conn->executeQuery($sqlToExec);
        $arrayResult = array();
        while($row = $this->conn->fetchAssoc($sqlResult)) {
            $categoriaTemp = CategoriaHelper::getObjFromDB($row);
            $arrayResult[] = CategoriaHelper::getJsonFromEntity($categoriaTemp);
        }
        $this->getModel()->setResult(
                ResultFactory::newResultArraySucesso($arrayResult, $numRows));
    }

}

?>
